package task1;

import java.util.Map;
import java.util.HashMap;
import java.util.Map.Entry;
import org.apache.log4j.Logger;

public class TextTemplateFactory implements ITemplateFactory {
	
	private static final Logger logger = Logger.getLogger(TextTemplateFactory.class);

	private int i;
	private String fileName,
				   str;
	private StringBuffer sb;
	private Map<Integer, String> hm;
	XMLTemplate newXML;
	LoadXMLTemplate loadXML;
		
	public TextTemplateFactory(String fileName) {
		logger.info("TextTemplateFactory(String) constructor");
		this.fileName = fileName;
		this.setTemplate();
	}
	
	/*
	 * Метод создает шаблон текстового представления объектов типа DataItem
	 * 
	 * Возвращает карту с парами "ключ-значение" для объектов типа DataItem 
	 * и их текстового представления
	 */
	private Map<Integer, String> setTemplate() {
		
		logger.info("TextTemplateFactory.setTemplate() method");
		
		i = 0;
		sb = new StringBuffer();
		hm = new HashMap<Integer, String>();
		loadXML = new LoadXMLTemplate(fileName);
		newXML = loadXML.getXMLTemplate();
		
		for (char ch : newXML.toString().toCharArray()) {			
			if (ch != '!')
				sb.append(ch);
			else if (i < 10) {
				hm.put(i++, sb.toString());
				sb.delete(0, sb.length());
			}			
		}
	
		return hm;
	}
	
	/*
	 * (non-Javadoc)
	 * @see task1.ITemplateFactory#getTemplate(task1.DataItem)
	 * 
	 * Метод служит для поиска в шаблоне текстовое представление преданной 
	 * переменной типа DataItem
	 * 
	 * Возвращает текстовое представление преданной переменной типа DataItem
	 */
	public String getTemplate(DataItem newDI) {
		
		logger.info("TextTemplateFactory.getTemplate(DataItem) method");
		
		/*
		 * Поиск текстового представления пременной типа DataItem в шаблоне
		 */
		for (Entry<Integer, String> entry : hm.entrySet()) {
	        if (entry.getKey().equals(newDI.getValue())) {
	            return str = entry.getValue();
	        }
	    }
		
		return str;
	}
}